home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / cpp_libs / rjs.lha / RJS / KernelVar / src / KernelVar.C next >
C/C++ Source or Header  |  1991-06-14  |  4KB  |  184 lines

  1.  
  2. #include <stdio.h>
  3. #include <iostream.h>
  4. #include <machine/param.h>
  5.  
  6.  
  7. #ifdef mips
  8. #include <sys/fixpoint.h>
  9. #endif
  10.  
  11. #include<libc.h>
  12. #include<osfcn.h>
  13.  
  14. #include "KernelVar.h"
  15.  
  16. #include <sys/cpudata.h>
  17.  
  18. const char *KMEM="/dev/kmem";
  19. const char *VMUNIX="/vmunix";
  20.  
  21. #define N_AVENRUN 3
  22.  
  23.     enum KernVars {        // MUST BE KEPT CONSISTANT WITH nlist struct
  24.         k_avenrun,
  25.         k_ifnet,
  26.         k_physmem,
  27.         k_freemem,
  28.         k_boottime,
  29.         k_total,
  30.         k_endofvars
  31.     };
  32.  
  33. static struct nlist nl[] = {
  34.     { "_avenrun" },        /* load average */
  35.     { "_ifnet"   },        /* network interface */
  36.     { "_physmem" },        /* physical memory */
  37.     { "_freemem" },        /* free memory */
  38.     { "_boottime"},        /* boot time */
  39.     { "_total"   },        /* vm stats */
  40.     { 0 }
  41. };
  42.  
  43. int RJS_KernelVar::init=0;
  44. int RJS_KernelVar::kmem=0;
  45.  
  46. RJS_KernelVar::RJS_KernelVar() 
  47. {
  48.     if (!init++) {
  49.         if ((kmem = open(KMEM, O_RDONLY)) < 0) {
  50.             printf("KernelVar: open failed for %s\n",KMEM);
  51.             exit(1);
  52.         }
  53.     
  54.         if (nlist(VMUNIX,nl) <0) {
  55.             printf("KernelVar: no namelist for %s\n",VMUNIX);
  56.             exit(1);
  57.         }
  58.     }
  59. }
  60.  
  61. RJS_KernelVar::~RJS_KernelVar()
  62. {
  63.     if (!--init) close(kmem);
  64. }
  65.  
  66. int RJS_KernelVar::readk(unsigned long loc, char *buf, int n)
  67. {
  68.     if (lseek(kmem, (int) loc, (int) L_SET)==-1) {
  69.         cerr << "KernelVar::readk can't lseek in /dev/kmem" << endl;
  70.         exit(1);
  71.     }
  72.     int stat=read(kmem, buf, n);
  73.     if (stat==-1) {
  74.         cerr << "KernelVar::readk can't read from /dev/kmem" << endl;
  75.         exit(1);
  76.     }
  77.     return stat;
  78. }
  79.  
  80. int RJS_KernelVar::num_ifnet(int &n) 
  81. {
  82. static int num=-1;
  83.  
  84.     if (nl[k_ifnet].n_type==0) return 0;
  85.     if (num==-1) {
  86.         struct ifnet ifn;
  87.         off_t firstif,ip;
  88.         ip=(int) nl[k_ifnet].n_value;
  89.         readk(ip,(char *)&firstif,sizeof(firstif));
  90.         num=0;
  91.         for (ip=firstif; ip; ip = (off_t) ifn.if_next) {
  92.             readk(ip,(char *)&ifn,sizeof(ifn));
  93.             num++;
  94.         }
  95.     }
  96.     n=num;
  97.     return 1;
  98. }
  99.  
  100. int RJS_KernelVar::get_ifnet(int i, kern_ifnet &kifnet) 
  101. {
  102.     int num;
  103.     if (!num_ifnet(num) || i<0 || i>=num) return 0;
  104.  
  105.     struct ifnet ifn;
  106.     off_t firstif,ip;
  107.     ip=(int) nl[k_ifnet].n_value;
  108.     readk(ip,(char *)&firstif,sizeof(firstif));
  109.     int n=0;
  110.  
  111.     for (ip=firstif; ip; ip = (off_t) ifn.if_next) {
  112.         readk(ip,(char *)&ifn,sizeof(ifn));
  113.         if (n==i) {
  114.           readk((unsigned long)ifn.if_name,kifnet.if_name,IFNAMSIZ);
  115.           kifnet.if_unit = ifn.if_unit;
  116.           kifnet.if_flags = ifn.if_flags;
  117.           kifnet.if_ipackets = ifn.if_ipackets;
  118.           kifnet.if_ierrors = ifn.if_ierrors;
  119.           kifnet.if_opackets = ifn.if_opackets;
  120.           kifnet.if_oerrors = ifn.if_oerrors;
  121.           kifnet.if_collisions = ifn.if_collisions;
  122.           return 1;
  123.         } 
  124.         n++;
  125.     }
  126.     return 0;
  127. }
  128.  
  129. int RJS_KernelVar::loadav(kern_loadav &kla)
  130. {
  131.     if (nl[k_avenrun].n_type==0) return 0;
  132. #ifdef    vax
  133.     double    kern_avenrun[3];
  134. #elif    mips
  135.     fix    kern_avenrun[3];
  136. #endif
  137.     readk( nl[k_avenrun].n_value, (char *) kern_avenrun,sizeof(kern_avenrun));
  138.  
  139.     for (int i=0; i<3; i++) {
  140. #ifdef    vax
  141.         kla.la[i] = kern_avenrun[i];
  142. #elif    mips
  143.         kla.la[i] = FIX_TO_DBL(kern_avenrun[i]);
  144. #endif
  145.     }
  146.     return 1;
  147. }
  148.  
  149.  
  150. int RJS_KernelVar::pages_to_k(int n)
  151. {
  152.     if (NBPG < 1024) return n / (1024/NBPG);
  153.     else return n*(NBPG/1024);
  154. }
  155.  
  156. int RJS_KernelVar::physmem(int &mem)
  157. {
  158.     if (nl[k_physmem].n_type==0) return 0;
  159.     readk( nl[k_physmem].n_value, (char *) &mem,sizeof(mem));
  160.     return 1;
  161. }
  162.  
  163.  
  164. int RJS_KernelVar::freemem(int &mem)
  165. {
  166.     if (nl[k_freemem].n_type==0) return 0;
  167.     readk( nl[k_freemem].n_value, (char *) &mem,sizeof(mem));
  168.     return 1;
  169. }
  170.  
  171. int RJS_KernelVar::boottime(struct timeval &boot)
  172. {
  173.     if (nl[k_boottime].n_type==0) return 0;
  174.     readk( nl[k_boottime].n_value, (char *) &boot,sizeof(boot));
  175.     return 1;
  176. }
  177.  
  178. int RJS_KernelVar::vmstats(struct vmtotal &vt)
  179. {
  180.     if (nl[k_total].n_type==0) return 0;
  181.     readk( nl[k_total].n_value, (char *) &vt,sizeof(vt));
  182.     return 1;
  183. }
  184.